package com.dong.service;



import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * TCP服务器组件
 * 负责在指定端口监听客户端连接，并处理消息交互
 */
@Slf4j
@Component
public class tcpservice {
    // 服务器Socket对象，用于监听端口
    private ServerSocket serverSocket;
    // 服务器运行状态标识
    private boolean isRunning = false;

    /**
     * 启动TCP服务器
     * @PostConstruct注解：在Spring容器初始化该Bean后自动执行
     */
    @PostConstruct
    public void startServer() {
        // 设置运行状态为true
        isRunning = true;

        // 启动新线程运行服务器（避免阻塞Spring Boot启动）
        new Thread(() -> {
            try {
                // 创建ServerSocket并绑定8888端口
                serverSocket = new ServerSocket(8888);
                System.out.println("TCP服务器已启动，监听端口：8888");

                // 循环接收客户端连接（服务器主循环）
                while (isRunning) {
                    // 阻塞等待客户端连接，连接成功后返回Socket对象
                    Socket clientSocket = serverSocket.accept();
                    System.out.println("新客户端连接：" + clientSocket.getInetAddress().getHostAddress());

                    // 启动新线程处理该客户端的消息（避免单个客户端阻塞服务器）
                    handleClient(clientSocket);
                }
            } catch (IOException e) {
                // 服务器正常关闭时的异常无需报错
                if (!isRunning) {
                    System.out.println("TCP服务器已正常关闭");
                } else {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 处理客户端消息
     * @param socket 与客户端连接的Socket对象
     */
    private void handleClient(Socket socket) {
        new Thread(() -> {
            // try-with-resources语法：自动关闭资源
            try (
                    // 获取输入流：用于读取客户端发送的消息
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(socket.getInputStream(), "UTF-8")
                    );
                    // 获取输出流：用于向客户端发送消息
                    // 第二个参数true表示自动刷新缓冲区
                    PrintWriter out = new PrintWriter(
                            new OutputStreamWriter(socket.getOutputStream(), "UTF-8"),
                            true
                    )
            ) {
                String message;
                // 循环读取客户端消息（阻塞操作）
                // 当客户端关闭连接时，in.readLine()会返回null
                while ((message = in.readLine()) != null) {
                    log.info("接收到了消息👍TCP" + message);
//                  System.out.println("收到客户端消息：" + message);
                    // 向客户端回复消息
//                    out.println("服务器已接收：" + message);
                    int a=Integer.parseInt(in.readLine());
                    log.info("<UNK>转换为int类型" + a);
                }
                System.out.println("客户端已断开连接");
            } catch (IOException e) {
                System.out.println("客户端连接异常断开：" + e.getMessage());
            }
        }).start();
    }

    /**
     * 关闭TCP服务器
     * @PreDestroy注解：在Spring容器销毁该Bean时自动执行（应用关闭时）
     */
    @PreDestroy
    public void stopServer() {
        // 设置运行状态为false，退出主循环
        isRunning = false;
        try {
            // 关闭ServerSocket，释放端口资源
            if (serverSocket != null) {
                serverSocket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


/**
 * import org.springframework.stereotype.Component;
 * import java.io.*;
 * import java.net.Socket;
 *
 * @Component
 * public class TcpClientComponent {
 *
 *     // 发送消息到TCP服务器
 *     public String sendMessage(String host, int port, String message) {
 *         try (Socket socket = new Socket(host, port);
 *              PrintWriter out = new PrintWriter(
 *                 new OutputStreamWriter(socket.getOutputStream()), true);
 *              BufferedReader in = new BufferedReader(
 *                 new InputStreamReader(socket.getInputStream()))) {
 *
 *             out.println(message); // 发送消息
 *             return in.readLine(); // 接收回复
 *
 *         } catch (IOException e) {
 *             e.printStackTrace();
 *             return "发送失败：" + e.getMessage();
 *         }
 *     }
 * }
 */

